home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / gui / gtlayout.lha / Source / LT_DeleteHandle.c < prev    next >
C/C++ Source or Header  |  1999-01-03  |  5KB  |  254 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1999 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #include "Assert.h"
  15.  
  16. #ifdef DO_BOOPSI_KIND    /* Support code */
  17. STATIC VOID
  18. LTP_BOOPSI_Cleanup(ObjectNode *group)
  19. {
  20.     ObjectNode *node;
  21.  
  22.     SCANGROUP(group,node)
  23.     {
  24.         switch(node->Type)
  25.         {
  26.             case BOOPSI_KIND:
  27.  
  28.                 DB(kprintf("2) disposing boopsi object\n"));
  29.  
  30.                 CloseLibrary(node->Special.BOOPSI.ClassBase);
  31.                 node->Special.BOOPSI.ClassBase = NULL;
  32.  
  33.                 FreeTagItems(node->Special.BOOPSI.ClassTags);
  34.                 node->Special.BOOPSI.ClassTags = NULL;
  35.  
  36.                 break;
  37.  
  38.             case GROUP_KIND:
  39.  
  40.                 LTP_BOOPSI_Cleanup(node);
  41.                 break;
  42.         }
  43.     }
  44. }
  45. #endif /* DO_BOOPSI_KIND */
  46.  
  47. VOID
  48. LTP_DisposeGadgets(struct LayoutHandle *Handle)
  49. {
  50.     if(Handle->List)
  51.     {
  52.         struct Gadget    *Gadget;
  53.         ObjectNode        *Node;
  54.  
  55.         LTP_StripGadgets(Handle,Handle->List);
  56.  
  57.         Gadget = Handle->List;
  58.  
  59.         if(Handle->ExitFlush)
  60.         {
  61.             while(Gadget)
  62.             {
  63.                 if(GETOBJECT(Gadget,Node))
  64.                 {
  65.                     LTP_PutStorage(Node);
  66.  
  67.                     LTP_DeleteObjectNode(Handle,Node);
  68.                 }
  69.  
  70.                 Gadget = Gadget->NextGadget;
  71.             }
  72.         }
  73.         else
  74.         {
  75.             while(Gadget)
  76.             {
  77.                 if(GETOBJECT(Gadget,Node))
  78.                     LTP_DeleteObjectNode(Handle,Node);
  79.  
  80.                 Gadget = Gadget->NextGadget;
  81.             }
  82.         }
  83.  
  84.         FreeGadgets(Handle->List);
  85.  
  86.         Handle->List = NULL;
  87.     }
  88.  
  89.     #ifdef DO_BOOPSI_KIND
  90.     {
  91.         if(Handle->BOOPSIList)
  92.         {
  93.             struct Gadget *gadget = (struct Gadget *)Handle->BOOPSIList,*next;
  94.             ObjectNode *Node;
  95.  
  96.             LTP_StripGadgets(Handle,(struct Gadget *)Handle->BOOPSIList);
  97.  
  98.             while(gadget)
  99.             {
  100.                 next = gadget->NextGadget;
  101.  
  102.                 if(GETOBJECT(gadget,Node))
  103.                 {
  104.                     switch(Node->Type)
  105.                     {
  106.                         case TEXTEDIT_KIND:
  107.  
  108.                             if(Node->Special.TextEdit.Font != NULL)
  109.                             {
  110.                                 CloseFont(Node->Special.TextEdit.Font);
  111.                                 Node->Special.TextEdit.Font = NULL;
  112.                             }
  113.  
  114.                             break;
  115.                     }
  116.  
  117.                     DB(kprintf("1) disposing boopsi object\n"));
  118.  
  119.                     DisposeObject(gadget);
  120.                     Node->Host = NULL;
  121.                 }
  122.  
  123.                 gadget = next;
  124.             }
  125.  
  126.             Handle->BOOPSIList = NULL;
  127.             Handle->BOOPSIPrevious = NULL;
  128.         }
  129.  
  130.             // Clean up all BOOPSI objects. This includes even those
  131.             // which have never been displayed.
  132.  
  133.         LTP_BOOPSI_Cleanup(Handle->TopGroup);
  134.     }
  135.     #endif    /* DO_BOOPSI_KIND */
  136. }
  137.  
  138.  
  139. /*****************************************************************************/
  140.  
  141.  
  142. /****** gtlayout.library/LT_DeleteHandle ******************************************
  143. *
  144. *   NAME
  145. *    LT_DeleteHandle -- Release storage space allocated by
  146. *                       LT_CreateHandleTagList, closing windows,
  147. *                       removing gadgets, etc.
  148. *
  149. *   SYNOPSIS
  150. *    LT_DeleteHandle(Handle);
  151. *                      A0
  152. *
  153. *    VOID LT_DeleteHandle(LayoutHandle *);
  154. *
  155. *   FUNCTION
  156. *    Windows and gadgets created by LT_CreateHandleTagList()
  157. *    are removed, any associated memory is deallocated.
  158. *
  159. *   INPUTS
  160. *    Handle - Pointer to a LayoutHandle structure created
  161. *        by LT_CreateHandleTaglist(). Passing NULL is
  162. *        harmless.
  163. *
  164. *   RESULT
  165. *    none
  166. *
  167. *   SEE ALSO
  168. *    gtlayout.library/CreateHandleTagList
  169. *
  170. ******************************************************************************
  171. *
  172. */
  173.  
  174. VOID LIBENT
  175. LT_DeleteHandle(REG(a0) LayoutHandle *Handle)
  176. {
  177.     if(Handle)
  178.     {
  179.         if(Handle->UnlockPubScreen)
  180.             UnlockPubScreen(NULL,Handle->PubScreen);
  181.  
  182.         #ifdef DO_CLONING
  183.         {
  184.             if(Handle->CloneExtra && Handle->CloneExtra->Screen)
  185.                 ScreenToBack(Handle->CloneExtra->Screen);
  186.         }
  187.         #endif
  188.  
  189.         LTP_DisposeGadgets(Handle);
  190.  
  191.         LT_UnlockWindow(Handle->Parent);
  192.  
  193.         if(Handle->Window)
  194.         {
  195.             LT_DeleteWindowLock(Handle->Window);
  196.  
  197.             if(Handle->MsgPort && Handle->Window->UserPort)
  198.             {
  199.                 struct IntuiMessage    *intuiMsg;
  200.                 struct Node            *next;
  201.  
  202.                 Forbid();
  203.  
  204.                 for(intuiMsg = (struct IntuiMessage *)Handle->Window->UserPort->mp_MsgList.lh_Head ; next = intuiMsg->ExecMessage.mn_Node.ln_Succ ; intuiMsg = (struct IntuiMessage *)next)
  205.                 {
  206.                     if(intuiMsg->IDCMPWindow == Handle->Window)
  207.                     {
  208.                         Remove(intuiMsg);
  209.  
  210.                         ReplyMsg(intuiMsg);
  211.                     }
  212.                 }
  213.  
  214.                 Handle->Window->UserPort = NULL;
  215.  
  216.                 ModifyIDCMP(Handle->Window,NULL);
  217.  
  218.                 Permit();
  219.             }
  220.  
  221.             ClearMenuStrip(Handle->Window);
  222.             CloseWindow(Handle->Window);
  223.         }
  224.  
  225.         #ifdef DO_MENUS
  226.         {
  227.             LT_DisposeMenu(Handle->Menu);
  228.         }
  229.         #endif    // DO_MENUS
  230.  
  231.         DisposeObject(Handle->AmigaGlyph);
  232.         DisposeObject(Handle->CheckGlyph);
  233.  
  234.         FreeScreenDrawInfo(Handle->Screen,Handle->DrawInfo);
  235.  
  236.         FreeVisualInfo(Handle->VisualInfo);
  237.  
  238.         DisposeObject(Handle->BevelImage);
  239.         DisposeObject(Handle->GrooveImage);
  240.  
  241.         if(Handle->RPort.Font && Handle->CloseFont)
  242.             CloseFont(Handle->RPort.Font);
  243.  
  244.         #ifdef DO_CLONING
  245.         {
  246.             if(Handle->CloneExtra && Handle->CloneExtra->Screen)
  247.                 CloseScreen(Handle->CloneExtra->Screen);
  248.         }
  249.         #endif
  250.  
  251.         AsmDeletePool(Handle->Pool,SysBase);
  252.     }
  253. }
  254.